import { useUserStore } from '@/stores'
// 导入路由实例
import router from '@/router'
import axios from 'axios'
import { showFailToast } from 'vant'

// 1. 新axios实例，基础配置
/**
 * 实际开发时候：
 * 1. 开发环境（pnpm dev =》.env.development）=> 后台地址：http://192.168.1.100:3000 | http://localhost:7001
 * 2. 生产环境（pnpm build =》.env.production）=> 后台地址：https://consult-api.itheima.net/
 * 问题：不同环境请求地址的切换
 * 解决方案1：手动换地址
 * 解决方案2: 通过环境变量自动切换（推荐）
 */
// const baseURL = 'https://consult-api.itheima.net/'
const baseURL = import.meta.env.VITE_APP_BASEURL

const request = axios.create({
  baseURL, // 后台基础地址
  timeout: 10000 // 请求超时时间
})

// 2. 请求拦截器，携带token=》请求发送前执行
request.interceptors.request.use(
  (config) => {
    const store = useUserStore()
    if (store.user.token) {
      // 如果有token统一向header中添加token
      config.headers.Authorization = `Bearer ${store.user.token}`
    }
    return config
  },
  (err) => Promise.reject(err)
)

// 3. 响应拦截器，剥离无效数据，401拦截=》请求已经发送并响应
request.interceptors.response.use(
  (res) => {
    // 统一错误提示
    // 后台约定，响应成功，但是code不是10000，是业务逻辑失败
    if (res.data?.code !== 10000) {
      showFailToast(res.data.message)
      return Promise.reject(res.data)
    }
    // 业务逻辑成功，返回响应数据，作为axios成功的结果
    return res.data?.data
  },
  (err) => {
    if (err.response.status === 401) {
      // 删除用户信息
      const store = useUserStore()
      store.delUser()
      // 跳转登录，带上接口失效所在页面的地址，登录完成后回跳使用
      // 说明：参数returnUrl=router.currentRoute获取当前页面点路由对象（是个ref变量）
      // 说明：
      // 1. router.currentRoute.value.fullPath全路径（携带?参数）
      // 2. router.currentRoute.value.path基础路径（不会携带?参数）
      router.push(`/login?returnUrl=${router.currentRoute.value.fullPath}`)
    }
    return Promise.reject(err)
  }
)

export { baseURL, request }
